#pragma once
#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;

namespace zj 
{
	class string
	{
	public:
		//构造函数的两种形式：
		//①
		//string()//无参
		//	:_str(new char[1]{'\0'})
		//	,_size(0)
		//	,_capacity(0)
		//{//这个构造函数的函数体是空的，因为所有初始化工作都在成员初始化列表中完成 }
		string(const char* str = "");
		~string();
		const char* c_str() const//成员函数
		//const char返回类型是一个指向常量字符的指针，不能修改字符串的内容
		//第二个const表示返回const char*指向的内容是只读的？？？？
		//详细：
		//第一个const表示返回的指针指向的内容不可修改
		//第二个表示这个成员函数不可修改类的成员变量（_str,_size,_capacity）
		{
			return _str;
		}
		 
		 //_str 是一个 char* 指针，指向动态分配的字符数组。
		//new char[1] 分配了一个大小为 1 的 char 数组。
		 //{ '\0' } 初始化这个数组的唯一元素为 '\0'（字符串的结束符）。
		void reserve(size_t n);
		void push_back(char ch);
		void append(const char* str);
		string& operator+=(char ch);
		string& operator+=(const char* str);

		void insert(size_t pos, size_t n, char ch);
		void insert(size_t pos, const char* str);
		void serase(size_t pos = 0, size_t len = npos);
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
		const static size_t npos;//声明npos
	};
	void test_string1();
	void test_string2();//其他函数调用这两个函数时需要使用string::，避免命名冲突
}